home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1994 November / macformat-018.iso / Utility Spectacular / Developer / PAPTool / PAPFile.cp < prev    next >
Encoding:
Text File  |  1992-11-29  |  5.3 KB  |  256 lines  |  [TEXT/MPS ]

  1. //    ©1992 Conrad Carlen & Manuel Veloso. All rights reserved.
  2. #ifndef __PLSTRINGFUNCS__
  3. #include <PLstringfuncs.h>
  4. #endif
  5.  
  6. #ifndef __MEMORY__
  7. #include <Memory.h>
  8. #endif
  9.  
  10. #ifndef __FILES__
  11. #include <Files.h>
  12. #endif
  13.  
  14. #ifndef __RESOURCES__
  15. #include <Resources.h>
  16. #endif
  17.  
  18. #ifndef _IDLE_
  19. #include "idle.h"
  20. #endif
  21.  
  22. #ifndef _PAPFILE_
  23. #include "PapFile.h"
  24. #endif
  25.  
  26. #define pStrCopy(src, dst) (BlockMove(src, dst, src[0]+1))
  27.  
  28. //    CPapCode
  29. //--------------------------------------------------------------------------
  30.  
  31. #pragma segment PAPCode
  32. CPapCode::CPapCode()
  33. {
  34.     fPapPtr = nil;
  35.     fPapHandle = nil;
  36. }
  37.  
  38. #pragma segment PAPCode
  39. CPapCode::~CPapCode()
  40. {
  41.     if (fPapPtr)
  42.     {
  43.         PAPUnload(GetPapPtr());
  44.         DisposHandle(fPapHandle);
  45.         fPapPtr = nil;
  46.         fPapHandle = nil;
  47.     }
  48. }
  49.  
  50. #pragma segment PAPCode
  51. OSErr CPapCode::IPapCode()
  52. {
  53.     OSErr error;
  54.     
  55.     error = GetPDEF();
  56.     if (error)
  57.     {
  58.         fPapPtr = nil;
  59.         fPapHandle = nil;
  60.     }
  61.     return error;
  62. }
  63.  
  64. #pragma segment PAPCode
  65. OSErr CPapCode::FindLaserwriter(FSSpec &theFile)
  66. {
  67.     long        temp = 0;
  68.     OSErr        error;
  69.     FInfo        theInfo;
  70.     SysEnvRec    theWorld;
  71.     
  72.     error = MyFindFolder(theFile.vRefNum, theFile.parID, kExtensionFolderType);
  73.     if (!error)
  74.     {
  75.         PLstrcpy(theFile.name, "\pLaserWriter");
  76.         error = HGetFInfo(theFile.vRefNum, theFile.parID, theFile.name, &theInfo);
  77.         if (error)    // laserwriter isn’t in the extensions folder; try system folder
  78.         {
  79.             SysEnvirons(curSysEnvVers, &theWorld);
  80.             GetWDInfo(theWorld.sysVRefNum, &(theFile.vRefNum), &(theFile.parID), &temp);
  81.             error = HGetFInfo(theFile.vRefNum, theFile.parID, theFile.name, &theInfo);
  82.         }
  83.     }
  84.     return error;
  85. }
  86.  
  87. #pragma segment PAPCode
  88. OSErr CPapCode::MyFindFolder(short &vRefNum, long &parID, OSType type)
  89. {
  90.     OSErr        error;
  91.     
  92.     error = FindFolder(kOnSystemDisk, type, kDontCreateFolder, &vRefNum, &parID);
  93.     return error;
  94. }
  95.  
  96. #pragma segment PAPCode
  97. OSErr CPapCode::GetPDEF()
  98. {
  99.     OSErr    error;
  100.     short    refNum;
  101.     FSSpec    theFile;
  102.     
  103.     error = FindLaserwriter(theFile);
  104.     nrequire(error, findlaser);
  105.     
  106.     refNum = HOpenResFile(theFile.vRefNum, theFile.parID, theFile.name, fsRdPerm);
  107.     require_action(refNum != -1, hopenresfile, error = ResError(););
  108.     
  109.     fPapHandle = Get1Resource('PDEF', 10);
  110.     require_action(fPapHandle, get1resource, error = ResError(););
  111.  
  112.     MoveHHi(fPapHandle);
  113.     HLock(fPapHandle);
  114.     fPapPtr = StripAddress(*fPapHandle);
  115.     DetachResource(fPapHandle);
  116.  
  117. get1resource:
  118. hopenresfile:
  119.     CloseResFile(refNum);
  120. findlaser:
  121.     return error;
  122. }
  123.  
  124. //    CPapFile
  125. //--------------------------------------------------------------------------
  126.  
  127. #pragma segment Main
  128. CPapFile::CPapFile()
  129. {
  130.     fReadBuffer.buf = nil;
  131.     fWriteBuffer.buf = nil;
  132.     fThePrinter.objStr[0] = 0;                    // no printer
  133.     fLastReadError = fLastWriteError = fCurrentError = noErr;
  134.     fRefNum = -1;
  135.     fReadStatus = fWriteStatus = fOpenStatus = fReadEOF = fWriteEOF = 0;
  136.     fStatus.status[0] = 0;
  137. }
  138.  
  139. #pragma segment Main
  140. CPapFile::~CPapFile()
  141. {
  142.     if (GetPapPtr() && (GetRefNum() != -1))
  143.     {
  144.         Close();
  145.     }
  146.     if (fReadBuffer.buf)
  147.     {
  148.         delete [] fReadBuffer.buf;
  149.     }
  150.     if (fWriteBuffer.buf)
  151.     {
  152.         delete [] fWriteBuffer.buf;
  153.     }
  154. }
  155.  
  156. #pragma segment Main
  157. OSErr CPapFile::IPapFile(short readBufferSize, short writeBufferSize)
  158. {
  159.     OSErr    error;
  160.     
  161.     error = IPapCode();
  162.     nrequire(error, nopapcode);
  163.  
  164.     fReadBuffer.buf = new char[readBufferSize+1];
  165.     require_action(fReadBuffer.buf, readbuf, error = -108;);
  166.  
  167.     fReadBuffer.size = readBufferSize;
  168.     fReadBuffer.buf[readBufferSize] = 0;        // so we can use c-string stuff on it
  169.     
  170.     fReadBuffer.count = 0;
  171.     fWriteBuffer.buf = new char[writeBufferSize+1];
  172.     require_action(fWriteBuffer.buf, writebuf, error = -108;);
  173.     
  174.     fWriteBuffer.size = writeBufferSize;
  175.     fWriteBuffer.buf[writeBufferSize] = 0;        // so we can use c-string stuff on it
  176.     fWriteBuffer.count = 0;
  177.     
  178.     return error;
  179. writebuf:
  180.     delete [] fReadBuffer.buf;
  181. readbuf:
  182. nopapcode:
  183.     return error;
  184. }
  185.  
  186. #pragma segment Main
  187. OSErr CPapFile::Open(EntityName &thePrinter)
  188. {
  189.     OSErr error;
  190.     short offset;
  191.     
  192.     offset = 0;
  193.     PLstrcpy(&fThePrinter.objStr[0], &thePrinter.objStr[0]);            // for some reason, NBPExtract won’t
  194.     offset += thePrinter.objStr[0]+1;
  195.     PLstrcpy(&fThePrinter.typeStr[0], &thePrinter.objStr[offset]);
  196.     offset += fThePrinter.typeStr[0]+1;
  197.     PLstrcpy(&fThePrinter.zoneStr[0], &thePrinter.zoneStr[offset]);
  198.     error = PAPOpen(&fRefNum, &thePrinter, kFlowQuantum, &fStatus, &fOpenStatus, GetPapPtr());
  199.     return error;
  200. }
  201.  
  202. #pragma segment Main
  203. OSErr CPapFile::Read()
  204. {
  205.     OSErr error;
  206.     error = PAPRead(GetRefNum(), GetReadBufferAddress(), &fReadBuffer.count, &fReadEOF, &fReadStatus, GetPapPtr());
  207.     fLastReadError = fCurrentError = error;
  208. }
  209.  
  210. #pragma segment Main
  211. OSErr CPapFile::Write()
  212. {
  213.     OSErr error;
  214.     error = PAPWrite(GetRefNum(), GetWriteBufferAddress(), GetWriteCount(), fWriteEOF, &fWriteStatus, GetPapPtr());
  215.     if (!error)
  216.     {
  217.         while (GetWriteStatus() > 0)
  218.         {
  219.             idle();
  220.         }
  221.     }
  222.     fLastWriteError = fCurrentError = error;
  223. }
  224.  
  225. #pragma segment Main
  226. OSErr CPapFile::Close()
  227. {
  228.     OSErr     error;
  229.     long    temp;
  230.     short    writeState;
  231.     
  232.     if (fRefNum == -1) return noErr;
  233.     error = PAPWrite(GetRefNum(), (char *)&temp, 0, true, &writeState, GetPapPtr());
  234.     if (!error)
  235.     {
  236.         while (writeState > 0)
  237.         {
  238.             idle();
  239.         }
  240.     }
  241.     error = PAPClose(GetRefNum(), GetPapPtr());
  242.     fRefNum = -1;
  243.     fCurrentError = error;
  244. }
  245.  
  246. #pragma segment Main
  247. OSErr CPapFile::Status()
  248. {
  249.     OSErr error;
  250.     EntityName    thePrinter;
  251.     
  252.     NBPSetEntity((Ptr) &thePrinter, (Ptr) fThePrinter.objStr, (Ptr) fThePrinter.typeStr, (Ptr) fThePrinter.zoneStr);
  253.     error = PAPStatus(&thePrinter, &fStatus, GetPapPtr());
  254.     fCurrentError = error;
  255. }
  256.